/**
 * @format
 * @Author: TC
 * @Date: 2025-05-05 01:44:00
 * @Last Modified by: TC
 * @Last Modified time: 2025-05-05 01:44:22
 */

import { mEventConst } from "db://assets/Script/Const/EventConst";
import { app } from "../../App";
import { mFrameConfigConst } from "../../Const/FrameConfigConst";

declare const gamebox: any;

/**
 * 4399游戏盒sdk
 */
export class Sdk4399GameBox {
    private gameBox: any = null;
    private bannerAd: any = null; //banner广告
    private interstitialAd: any = null; //插屏广告
    private rewardedAd: any = null; //激励视频广告

    constructor() {
        this.gameBox = gamebox;
    }

    //登录
    public async login() {
        console.log("start login", gamebox.login);
        return new Promise((resolve) => {
            this.gameBox.login({
                success(res: any) {
                    console.log("res", res);
                    if (res.code) {
                        resolve(res.code);
                    } else {
                        app.log.log("登录失败！" + res.errMsg);
                    }
                },
            });
        });
    }

    //分享给好友
    public share(): void {
        this.gameBox.shareMessageToFriend({
            type: 0, //0： 普通分享 1：邀战分享
            success: (res: any) => {
                //分享成功回调
            },
            fail: (res: any) => {
                //分享失败回调
            },
            complete: (res: any) => {
                //成功失败都会走的回调
            },
        });
    }

    //提交分数
    // { "code":1001, "msg": "未知错误" }
    // { "code":1002, "msg": "参数不全" }
    // { "code":1006, "msg": "用户认证失败" }
    // { "code":3001, "msg": "排行榜权限未开通" }
    // { "code":3002, "msg": "该排行榜不存在" }
    // { "code":3003, "msg": "榜单未生效" }
    public submit(score: number): void {
        this.gameBox.submitRankScore(mFrameConfigConst.rankId, score, function (res) {
            app.log.log("提交结果：", res.data.score, res.data.rank);
            switch (res.code) {
                case 1000:
                    app.log.log("提交成功");
                    this.gamebox.showRankList();
                case 1001:
                    app.log.log("未知错误");
                    break;
                case 1002:
                    app.log.log("参数不全");
                    break;
                case 1006:
                    app.log.log("用户认证失败");
                    break;
                case 3001:
                    app.log.log("排行榜权限未开通");
                    break;
                case 3002:
                    app.log.log("该排行榜不存在");
                    break;
                case 3003:
                    app.log.log("榜单未生效");
                    break;
            }
        });
    }

    //显示排行榜
    public showRank(): void {
        this.gameBox.showRankList();
    }

    //显示更多好玩
    public showMore(): void {}

    /***********************************商业化************************************ */

    //banner广告
    public showBannerAd(): void {
        this.hideBannerAd();
        //可自定义 Banner 广告位置和宽高(单位px),默认最小宽度为 320 * pixelRatio(设备像素比),最小高度为 50 * pixelRatio
        //真机屏幕的实际宽度(单位px)为 screenWidth * pixelRatio,实际高度(单位px)为 screenWidth * pixelRatio
        // screenWidth、screenWidth和pixelRatio(均可通过gamebox.getSystemInfoSync获取)

        //获取真机设备像素比
        const pixelRatio: number = gamebox.getSystemInfoSync().pixelRatio;
        const width: number = gamebox.getSystemInfoSync().screenWidth;
        const height: number = gamebox.getSystemInfoSync().screenHeight;
        if (!this.bannerAd) {
            this.bannerAd = gamebox.createBannerAd({
                style: {
                    width: width * pixelRatio,
                    height: 90 * pixelRatio,
                    left: 0,
                    top: (height - 90) * pixelRatio,
                },
            });
            //监听 Banner 广告加载事件回调函数
            const bannerOnLoadCb = (res: any) => {
                app.log.info("Banner onLoad" + res);
            };
            //监听 Banner 广告错误事件回调函数
            const bannerOnErrorCb = (res: any) => {
                app.log.info("Banner onError" + res);
            };
            //监听 Banner 广告加载事件
            this.bannerAd.onLoad(bannerOnLoadCb);
            //监听 Banner 广告错误事件
            this.bannerAd.onError(bannerOnErrorCb);
        }
        this.bannerAd.show().catch((err: any) => {
            app.log.log("Banner 广告显示失败", err);
        });
    }

    public hideBannerAd(): void {
        if (this.bannerAd) this.bannerAd.hide();
        // this.bannerAd.destroy();
    }

    //插屏广告
    public showInterstitialAd(): void {
        const interstitialAd = gamebox.createInterstitialAd();
        interstitialAd.show().catch(() => {
            // 失败重试
            interstitialAd
                .load()
                .then(() => interstitialAd.show())
                .catch((err) => {
                    app.log.log("InterstitialAd 广告显示失败", err);
                });
        });
        //监听 InterstitialAd 广告加载事件回调函数
        const onLoadCb = (res: any) => {
            app.log.info("InterstitialAd onLoad" + res);
        };
        //监听 InterstitialAd 广告关闭回调函数
        const onCloseCb = (res: any) => {
            app.log.info("InterstitialAd onClose" + res);
        };
        //监听 InterstitialAd 广告错误事件回调函数
        const onErrorCb = (res: any) => {
            app.log.info("InterstitialAd onError" + res);
        };
        //监听 InterstitialAd 广告加载事件
        interstitialAd.onLoad(onLoadCb);
        //取消监听 InterstitialAd 广告加载事件(监听取消的函数，应与监听回调函数为同一个）
        // interstitialAd.offLoad(onLoadCb)
        //监听 InterstitialAd 广告关闭
        interstitialAd.onClose(onCloseCb);
        //取消监听 InterstitialAd 广告关闭(监听取消的函数，应与监听回调函数为同一个）
        // interstitialAd.offClose(onCloseCb)
        //监听 InterstitialAd 广告错误
        interstitialAd.onError(onErrorCb);
        //取消监听 InterstitialAd 广告错误(监听取消的函数，应与监听回调函数为同一个）
        // interstitialAd.offError(onErrorCb)
        //销毁 InterstitialAd 广告
        // interstitialAd.destroy()
    }

    //激励视频广告
    public showRewardedAd(cb: Function = null): void {
        this.hideBannerAd();
        const rewardedAd = gamebox.createRewardedVideoAd();
        rewardedAd.show().catch(() => {
            // 失败重试
            rewardedAd
                .load()
                .then(() => rewardedAd.show())
                .catch((err) => {
                    app.log.log("激励视频 广告显示失败", err);
                    app.eventMgr.dispatch(mEventConst.SHOW_BANNER_AD);
                });
        });
        //监听原生模板广告加载事件
        rewardedAd.onLoad((res: any) => {
            app.log.info("onLoad" + res);
        });
        //取消监听原生模板广告加载事件
        // rewardedAd.offLoad((res)=>{
        //      tc.info('offLoad' + res);
        // })
        //监听原生模板广告错误事件
        rewardedAd.onError((res: any) => {
            app.log.info("onError" + res);
            app.eventMgr.dispatch(mEventConst.SHOW_BANNER_AD);
        });
        //取消监听原生模板广告错误事件(监听取消的函数，应与监听回调函数为同一个）
        // rewardedAd.offError((res)=>{
        //      tc.info('offError' + res);
        // })
        //监听原生模板广告关闭事件
        rewardedAd.onClose((res: any) => {
            app.log.info("onClose" + res);
            app.eventMgr.dispatch(mEventConst.SHOW_BANNER_AD);
        });
        //取消监听原生模板广告关闭事件(监听取消的函数，应与监听回调函数为同一个）
        // rewardedAd.offClose((res)=>{
        //      tc.info('offClose' + res);
        // })
        //监听原生模板广告播放完毕事件
        rewardedAd.onCompleted((res: any) => {
            app.log.info("onCompleted" + res);
            if (cb) {
                cb();
            }
        });
        //取消监听原生模板广告播放完毕事件(监听取消的函数，应与监听回调函数为同一个）
        // rewardedAd.offCompleted((res)=>{
        //      tc.info('offCompleted' + res);
        // })
        //销毁原生模板广告
        // rewardedAd.destroy();
    }
}
